<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="zSN60" id="zSN60"><span data-lake-id="u28c8e058" id="u28c8e058">典型回答</span></h1>
  <p data-lake-id="u1adaf58a" id="u1adaf58a"><br></p>
  <p data-lake-id="u03b156ce" id="u03b156ce"><span data-lake-id="u7da6091a" id="u7da6091a">就像电报只能发出”滴”和”答”声一样，计算机只认识0和1两种字符，但是，人类的文字是多种多样的，如何把人类的文字转换成计算机认识的01字符呢，这个过程同样需要通过</span><strong><span data-lake-id="uff504a9e" id="uff504a9e">字符编码</span></strong><span data-lake-id="u393795e5" id="u393795e5">。</span></p>
  <p data-lake-id="u5748501e" id="u5748501e"><span data-lake-id="ubb75dad8" id="ubb75dad8">​</span><br></p>
  <blockquote data-lake-id="u5d5f0c0f" id="u5d5f0c0f">
   <p data-lake-id="u09aace97" id="u09aace97"><span data-lake-id="u1dfbf64d" id="u1dfbf64d">字符编码（Character encoding）是一套法则，使用该法则能够对自然语言的字符的一个集合（如字母表或音节表），与其他东西的一个集合（如号码或电脉冲）进行配对。</span></p>
  </blockquote>
  <p data-lake-id="u4d8a090d" id="u4d8a090d"><span data-lake-id="u08ce223f" id="u08ce223f" class="lake-fontsize-12" style="color: rgb(153, 153, 153)">​</span><br></p>
  <p data-lake-id="ueacd2f07" id="ueacd2f07" style="text-align: justify"><span data-lake-id="u2049cf24" id="u2049cf24">和摩尔斯电码功能类似，上个世纪60年代，美国制定了一套字符编码，对英语字符与二进制位之间的关系，做了统一规定，这被称为 ASCII 码，一直沿用至今。</span></p>
  <p data-lake-id="u81d6621f" id="u81d6621f" style="text-align: justify"><span data-lake-id="u5f9188b2" id="u5f9188b2">​</span><br></p>
  <p data-lake-id="ue5c61d5c" id="ue5c61d5c" style="text-align: justify"><span data-lake-id="u6112f446" id="u6112f446">由于ASCII只有128个字符，虽然对于英文字符都可以表示了，但是世界上还有很多其他的文字他是没办法表示的，所以需要一种更加全面的字符编码。</span></p>
  <p data-lake-id="ua4136c9e" id="ua4136c9e" style="text-align: justify"><span data-lake-id="ub2fdc11f" id="ub2fdc11f">​</span><br></p>
  <p data-lake-id="ua2eefa60" id="ua2eefa60" style="text-align: justify"><span data-lake-id="uc9365bda" id="uc9365bda">于是又出现了</span><strong><span data-lake-id="u8054414f" id="u8054414f">Unicode字符集</span></strong><span data-lake-id="u64312e71" id="u64312e71">（常见的Unicode Transformation Format有：UTF-7, UTF-7.5, </span><strong><span data-lake-id="ueb43d0c5" id="ueb43d0c5">UTF-8</span></strong><span data-lake-id="u8b514d29" id="u8b514d29">,UTF-16, 以及 UTF-32），除此之外还有一些常用的中文编码有</span><strong><span data-lake-id="u93902afc" id="u93902afc">GBK</span></strong><span data-lake-id="ucf370397" id="ucf370397">，</span><strong><span data-lake-id="u4ce39274" id="u4ce39274">GB2312</span></strong><span data-lake-id="ua888a2a1" id="ua888a2a1">，</span><strong><span data-lake-id="u3d7df07d" id="u3d7df07d">GB18030</span></strong><span data-lake-id="ub12551b5" id="ub12551b5">等。</span></p>
  <p data-lake-id="ua15549b2" id="ua15549b2"><span data-lake-id="ue3bbe7a1" id="ue3bbe7a1">​</span><br></p>
  <h1 data-lake-id="zmWgp" id="zmWgp"><span data-lake-id="u51d80862" id="u51d80862">扩展知识</span></h1>
  <p data-lake-id="u3b3d2219" id="u3b3d2219"><br></p>
  <h2 data-lake-id="ClaXM" id="ClaXM"><span data-lake-id="u584ebdaa" id="u584ebdaa">Unicode和UTF-8有啥关系？</span></h2>
  <p data-lake-id="u0a534374" id="u0a534374"><br></p>
  <p data-lake-id="ufdc655a4" id="ufdc655a4"><span data-lake-id="u9dadd2bb" id="u9dadd2bb">Unicode（中文：万国码、国际码、统一码、单一码）是计算机科学领域里的一项业界标准。它对世界上大部分的文字系统进行了整理、编码，使得计算机可以用更为简单的方式来呈现和处理文字。</span></p>
  <p data-lake-id="u2b455697" id="u2b455697"><span data-lake-id="u5df5fff9" id="u5df5fff9">​</span><br></p>
  <p data-lake-id="u41352dcc" id="u41352dcc"><span data-lake-id="u11a22668" id="u11a22668">Unicode备受认可，并广泛地应用于计算机软件的国际化与本地化过程。有很多新科技，如可扩展置标语言（Extensible Markup Language，简称：XML）、Java编程语言以及现代的操作系统，都采用Unicode编码。</span></p>
  <p data-lake-id="u871e7047" id="u871e7047"><span data-lake-id="u81263243" id="u81263243">​</span><br></p>
  <p data-lake-id="ud74425d3" id="ud74425d3"><strong><span data-lake-id="u6e2a1797" id="u6e2a1797">Unicode是一套通用的字符集，包含世界上的大部分文字</span></strong><span data-lake-id="ub1c02885" id="ub1c02885">，也就是说，Unicode是可以表示中文的。</span></p>
  <p data-lake-id="u706f7935" id="u706f7935"><br></p>
  <p data-lake-id="u5c20b1cb" id="u5c20b1cb"><span data-lake-id="uaad04451" id="uaad04451">但是，</span><strong><span data-lake-id="u05d3756c" id="u05d3756c">Unicode虽然统一了全世界字符的编码，但没有规定如何存储。</span></strong><span data-lake-id="u0ccdd94c" id="u0ccdd94c">​</span></p>
  <p data-lake-id="u9d8be3a2" id="u9d8be3a2"><span data-lake-id="ude9ee631" id="ude9ee631">​</span><br></p>
  <p data-lake-id="u563b2234" id="u563b2234"><span data-lake-id="u7e0ccce0" id="u7e0ccce0">因为如果Unicode统一规定，每个符号就要用三个或四个字节表示，因为字符太多，只能用这么多字节才能表示完全。一旦这么规定，那么每个英文字母前都必然有二到三个字节是0，因为所有英文字母在ASCII中都有，都可以用一个字节表示，剩余字节位置就要补充0。如果这样，文本文件的大小会因此大出二三倍，这对于存储来说是极大的浪费。</span></p>
  <p data-lake-id="u1a89ae06" id="u1a89ae06"><span data-lake-id="u681dc9c9" id="u681dc9c9">​</span><br></p>
  <p data-lake-id="ue3bf1c41" id="ue3bf1c41"><span data-lake-id="ud210589c" id="ud210589c">为了解决这个问题，就出现了一些中间格式的字符集，他们被称为通用转换格式，</span><strong><span data-lake-id="uab131eaa" id="uab131eaa">即UTF（Unicode Transformation Format）。</span></strong><span data-lake-id="uf52996d6" id="uf52996d6">常见的UTF格式有：UTF-7, UTF-7.5, UTF-8,UTF-16, 以及 UTF-32。</span></p>
  <p data-lake-id="u99f58254" id="u99f58254"><span data-lake-id="u415defbd" id="u415defbd">​</span><br></p>
  <p data-lake-id="u9781462b" id="u9781462b"><span data-lake-id="u69b53309" id="u69b53309">UTF-8 使用一至四个字节为每个字符编码</span></p>
  <p data-lake-id="u3e863073" id="u3e863073"><span data-lake-id="u02a9492a" id="u02a9492a">UTF-16 使用二或四个字节为每个字符编码</span></p>
  <p data-lake-id="u4af5d294" id="u4af5d294"><span data-lake-id="u5b26906e" id="u5b26906e">UTF-32 使用四个字节为每个字符编码</span></p>
  <p data-lake-id="u55699a88" id="u55699a88"><span data-lake-id="uebe08ce3" id="uebe08ce3">​</span><br></p>
  <p data-lake-id="u0d902c47" id="u0d902c47"><strong><span data-lake-id="u8f467d84" id="u8f467d84">所以我们可以说，UTF-8、UTF-16等都是 Unicode 的一种实现方式。</span></strong></p>
  <p data-lake-id="uf039d14d" id="uf039d14d"><strong><span data-lake-id="uf1a1d8d7" id="uf1a1d8d7">​</span></strong><br></p>
  <h2 data-lake-id="gkjPW" id="gkjPW"><span data-lake-id="ud8c7cd8a" id="ud8c7cd8a">有了UTF-8，为什么要出现GBK<br><br></span></h2>
  <p data-lake-id="ue3ac93a6" id="ue3ac93a6"><span data-lake-id="u5b626fd5" id="u5b626fd5">因为UTF-8是Unicode的一种实现，所以他包含了世界上的所有文字的编码，他采用的是1-4字节进行编码。</span></p>
  <p data-lake-id="u48e379a8" id="u48e379a8"><span data-lake-id="ua8207704" id="ua8207704">​</span><br></p>
  <p data-lake-id="u37e88226" id="u37e88226"><span data-lake-id="u21eae1a8" id="u21eae1a8">对于那些排在前面优先纳入的文字，可能就优先使用1字节、2字节存储了，对于后纳入的文字，就要使用3字节或者4字节存储了。</span></p>
  <p data-lake-id="u6d91ba8d" id="u6d91ba8d"><span data-lake-id="u0dffe175" id="u0dffe175">​</span><br></p>
  <p data-lake-id="u5e17b9f5" id="u5e17b9f5"><strong><span data-lake-id="u96481177" id="u96481177">正是因为UTF-8太全了，所以那些晚一些纳入的字符，在UTF-8中的存储所占的字节数可能就会多一些，那他的存储空间要求就会很大。</span></strong></p>
  <p data-lake-id="u5ecf3e3f" id="u5ecf3e3f"><span data-lake-id="uccf3a3fc" id="uccf3a3fc">​</span><br></p>
  <p data-lake-id="u09a5828b" id="u09a5828b"><span data-lake-id="u78946059" id="u78946059">对于常用的汉字，在UTF-8中采用3字节进行编码，但是如果有一种只包含中文和ASCII的编码的话，就不需要使用3个字节，可能2个字节就够了。</span></p>
  <p data-lake-id="ud8a1feec" id="ud8a1feec"><span data-lake-id="u81cf865e" id="u81cf865e">​</span><br></p>
  <p data-lake-id="u9ca9777a" id="u9ca9777a"><span data-lake-id="u27514774" id="u27514774">对于大部分网站来说，基本都是只服务一个国家或者地区的，比如一个中国的网站，一般会出现简体字和繁体字以及一些英文字符，很少会出现日语或者韩文的。</span></p>
  <p data-lake-id="u11880ee0" id="u11880ee0"><span data-lake-id="ua221ead4" id="ua221ead4">​</span><br></p>
  <p data-lake-id="u2995fee7" id="u2995fee7"><span data-lake-id="ud3175558" id="ud3175558">也是出于这样的考虑，中国国家标准总局于1981年制定并实施了 GB 2312-80 编码，即中华人民共和国国家标准简体中文字符集。后来厂商微软利用GB 2312-80未使用的编码空间，收录GB 13000.1-93全部字符制定了GBK编码。</span></p>
  <p data-lake-id="u2c6683f8" id="u2c6683f8"><span data-lake-id="u9a91b16f" id="u9a91b16f">​</span><br></p>
  <p data-lake-id="uc59fa209" id="uc59fa209"><span data-lake-id="ua3998061" id="ua3998061">有了标准中文字符集，如果是一个纯中文网站，就可以可以采用这种编码方式，这样可以大大节省一些存储空间的。</span></p>
  <p data-lake-id="ua9dc441c" id="ua9dc441c"><span data-lake-id="u54ace8f1" id="u54ace8f1">​</span><br></p>
  <p data-lake-id="u5358a20a" id="u5358a20a"><span data-lake-id="u06ad1566" id="u06ad1566">常用的中文编码有GBK，GB2312，GB18030等，最常用的是GBK。</span></p>
  <ul list="ud6cb5d77" data-lake-index-type="true">
   <li fid="u16728ea4" data-lake-id="u6c6535f2" id="u6c6535f2"><span data-lake-id="u5e93d75b" id="u5e93d75b">GB2312（1980年）：16位字符集，收录有6763个简体汉字，682个符号，共7445个字符；</span></li>
  </ul>
  <ul list="ud6cb5d77" data-lake-indent="1" data-lake-index-type="true">
   <li fid="u62a37728" data-lake-id="ud0f36f7f" id="ud0f36f7f"><span data-lake-id="uf8fdb1ca" id="uf8fdb1ca">优点：适用于简体中文环境，属于中国国家标准，通行于大陆，新加坡等地也使用此编码；</span></li>
   <li fid="u62a37728" data-lake-id="ub6821edf" id="ub6821edf"><span data-lake-id="uad7ae7b6" id="uad7ae7b6">缺点：不兼容繁体中文，其汉字集合过少。</span></li>
  </ul>
  <ul list="ud6cb5d77" start="2" data-lake-index-type="true">
   <li fid="u16728ea4" data-lake-id="u34c1b434" id="u34c1b434"><span data-lake-id="ueaf6d831" id="ueaf6d831">GBK（1995年）：16位字符集，收录有21003个汉字，883个符号，共21886个字符；</span></li>
  </ul>
  <ul list="ud6cb5d77" data-lake-indent="1" data-lake-index-type="true">
   <li fid="uba265ed1" data-lake-id="u0ce1d4b6" id="u0ce1d4b6"><span data-lake-id="u02386f8f" id="u02386f8f">优点：适用于简繁中文共存的环境，为简体Windows所使用，向下完全兼容gb2312，向上支持 ISO-10646 国际标准 ；所有字符都可以一对一映射到unicode2.0上；</span></li>
   <li fid="uba265ed1" data-lake-id="u7cf07e84" id="u7cf07e84"><span data-lake-id="u61ea747d" id="u61ea747d">缺点：不属于官方标准，和big5之间需要转换；很多搜索引擎都不能很好地支持GBK汉字。</span></li>
  </ul>
  <ul list="ud6cb5d77" start="3" data-lake-index-type="true">
   <li fid="u16728ea4" data-lake-id="u7705986a" id="u7705986a"><span data-lake-id="u11471b87" id="u11471b87">GB18030（2000年）：32位字符集；收录了27484个汉字，同时收录了藏文、蒙文、维吾尔文等主要的少数民族文字。</span></li>
  </ul>
  <ul list="ud6cb5d77" data-lake-indent="1" data-lake-index-type="true">
   <li fid="uf98fcdbe" data-lake-id="u47bc19fb" id="u47bc19fb"><span data-lake-id="u35eb88dd" id="u35eb88dd">优点：可以收录所有你能想到的文字和符号，属于中国最新的国家标准；</span></li>
   <li fid="uf98fcdbe" data-lake-id="ufbf7f0a4" id="ufbf7f0a4"><span data-lake-id="u4311c783" id="u4311c783">缺点：目前支持它的软件较少。</span></li>
  </ul>
  <p data-lake-id="u81216afc" id="u81216afc"><br></p>
  <h2 data-lake-id="Wuu55" id="Wuu55"><span data-lake-id="u93cb05f8" id="u93cb05f8">为什么会出现乱码</span></h2>
  <p data-lake-id="u32171dc2" id="u32171dc2"><span data-lake-id="ue9f6dfbf" id="ue9f6dfbf">文件里面的内容归根到底都是有0101组成的，至于0101的二进制码如何转成人们可以理解的字符串，则是需要通过规定好的字符编码标准进行转换才可以。</span></p>
  <p data-lake-id="u7c7c7610" id="u7c7c7610"><span data-lake-id="uc28243c7" id="uc28243c7">​</span><br></p>
  <p data-lake-id="uac9aecc2" id="uac9aecc2"><span data-lake-id="u6c1482fc" id="u6c1482fc">我们把一串中文字符通过UTF-8进行编码传输给别人，别人拿到这串文字之后，通过GBK进行解码，得到的内容就会是“锟届瀿锟斤拷雮傡锟斤拷直锟斤拷锟”，这就是乱码。</span></p>
  <p data-lake-id="u51a52a50" id="u51a52a50"><span data-lake-id="u1ec231a9" id="u1ec231a9">​</span><br></p>
 </body>
</html>